//: Playground - noun: a place where people can play

import UIKit

// CGPoint

// 定义结构体
struct Location {
    var x : Double
    var y : Double

    // (1) 普通函数
    func test() {
        print("这是结构体内的一个普通方法")
    }

    // (2) 改变成员的属性, 函数必须用 mutating 修饰
    mutating func moveH(distance : Double) {
        self.x += distance
    }

    // (3) 构造函数
    // 1. 默认情况下系统会为结构体提供一个默认构造函数, 并且该构造函数要求对成员属性赋值
    // 2. 构造函数都是以init开始, 并且不需要返回值
    // 3. 在构造函数结束之前, 必须保证所有的成员属性被初始化

    // 默认的初始化方法 (构造方法)
    init(x : Double, y : Double) {
        self.x = x
        self.y = y
    }

    // 自定义初始化方法 (构造方法)
    init(xy : String) {
        let array = xy.components(separatedBy: ",")
        let item0 = array[0]
        let item1 = array[1]

        // ?? 会判断前面的可选类型是否有值
        // 有值, 则解包; 没有值, 则使用后面的值
        self.x = Double(item0) ?? 0
        self.y = Double(item1) ?? 0
    }
}

var center = Location(x: 100.0, y: 100.0)
center.test()
center.moveH(distance: 20.0)
let x = center.x
print(x)
